﻿/***************************************************COPYRIGHT***************************************
* Copyright (c) 2008, Whiteboard-IT
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that 
* the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following 
 * disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided with the distribution.
*
* Neither the name of Whiteboard-IT, LLC nor the names of its contributors may be used to endorse or promote 
 * products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*****************************************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Boo.Lang;

namespace Mite
{
	internal static class ObjectExtensions
	{
		public static bool ToBool(this object value)
		{
			bool rv;
			if (!bool.TryParse(value.ToString(), out rv))
			{
				if (value.ToString().Equals("YES", StringComparison.CurrentCultureIgnoreCase) ||
				    value.ToString().Equals("1"))
					rv = true;
				else
					rv = false;
			}

			return rv;
		}

		public static object PopulateObjectFromHash(this Hash hash, object obj)
		{
			var properties = new List<PropertyInfo>(obj.GetType().GetProperties());
			foreach (object key in hash.Keys)
			{
				//if it has a property assign it.  if not then throw an exception
				PropertyInfo prop = properties.FirstOrDefault(p => p.Name.ToLower() == key.ToString().ToLower());
				if (prop != null)
				{
					string propertyName = prop.Name;
					SetPropertyValue(obj, propertyName, hash[key]);
				}
				else
					throw new Exception("Property does not exist on type");
			}
			return obj;
		}

		private static void SetPropertyValue(object obj, string propertyName, object propertyValue)
		{
			PropertyInfo pi = obj.GetType().GetProperty(propertyName);
			pi.SetValue(obj, propertyValue, null);
		}

		public static int ToInt(this object value)
		{
			int i;
			if (int.TryParse(value.ToString(), out i))
				return i;
			else
				return 0;
		}
	}

	public static class StringExtensions
	{
		public static bool IsNullOrEmpty(this string s)
		{
			return String.IsNullOrEmpty(s);
		}
	}
}